const router = require('express').Router();
const mysql = require('mysql')
const jwt = require('jsonwebtoken')
// 写接口： 
router.route("/login").post((req, res) => {
  // console.log("调接口没有？")
  let { username, password } = req.body;
  // 创建一个与数据库的链接：
  const db = mysql.createConnection({
    host: 'localhost', // 数据库在哪里？ip, 127.0.0.1,localhost
    port: '3306', // 端口
    user: 'root', // 用户名
    password: '1234', // 密码
    database: 'mydoctor',//数据库的名称
    multipleStatements: true, //true，允许同时执行多条SQL语句
    timezone: '08:00' //设置时区,如果不设置，就可能出现1天的时差
  })
  // 打开连接
  db.connect(); // nodejs 与mysql 进行通信
  // 执行SQL语句：
  // db.query(sql， 参数数组， 回调函数)
  // 为了防止SQL注入的漏洞，使用?做变量的占位符号，而不使用字符串+变量的拼接。
  let sql = 'SELECT * FROM `users` WHERE `uaccess`=? AND `upassword`=?;';
  let params = [username, password]; // 数组里面内容的顺序，对应sql语句里面？的先后顺序。
  let cb = (err, data) => {
    // 写接口时，必须输出err,data，方便测试接口。
    // 接口没有问题后，在注释掉
    // console.log(err)
    // console.log(data)

    if (err === null && data.length === 1) {
      // 在登录成功时，给req.session对象，添加一个key;
      req.session.user = username;

      // token的创建：
      // sign(1. 数据对象， 2. 密钥， 3. 选项设置)
      let token = jwt.sign({ user: username }, 'laowenzi', { expiresIn: '20s' });
      console.log("token------------", token);
      // 如果后要返回token给前端， 那么前端就不能使用form表单的submit按钮来登录。只能时ajax。
      let user = data[0];
      delete user.upassword
      res.json({
        code: 200, msg: '登录成功', token, data: user
      })

      // res.redirect("/html/main.html")
    } else {
      // res.redirect("/index.html")
      res.json({
        code: 4001, msg: '登录失败',
      })
    }
    /* 
     // err, 表示错误对象，只要执行SQL失败，就查看err信息，找原因。
        // console.log(err)  // null,表示没有错误发生
        // console.log(data) // data如果是[],表示查无此账号。即登录失败。
    
    一个JSON对象：
    [
      RowDataPacket {
        uid: 3,
        uaccess: 'wenqingwu',
        uname: '皮尼亚',
        upassword: '123456',
        usex: '女',
        usid: '512012198808081234',
        utel: '13258231798',
        uphoto: 'dayuh-1672044597055.webp',
        ustate: '1'
      }
    ]
    */
  }
  db.query(sql, params, cb);
  // 关闭连接
  db.end()
})



router.route('/testApi').get((req, res) => {
  // 1. token通过普通参数传递：
  let { a, b, token } = req.query;
  try {
    let result = jwt.verify(token, 'laowenzi')
    console.log(result); // 解密成功，就可以看到响应给客户端的数据。如果解密失败。则抛出一个异常。
    // 为了防止Nodejs因异常而中断服务，所以使用try-catch来处理异常信息。

    // 下一步业务逻辑的实现

    res.json({ code: 200, msg: "token验证通过，调用接口成功" })
  } catch {
    console.log('无效的token。');
    res.json({ code: 40005, msg: "token失效" })
  }

}).post((req, res) => {
  let { a, b } = req.body;
  console.log(a, b);
  let token = req.headers.token; // 从请求头里面获取token
  try {
    let result = jwt.verify(token, 'laowenzi')
    console.log(result); // 解密成功，就可以看到响应给客户端的数据。如果解密失败。则抛出一个异常。
    res.json({ code: 200, msg: "token验证通过，调用接口成功", data: [1, 2, 3, 4] })
  } catch {
    console.log('无效的token。');
    res.json({ code: 40005, msg: "token失效" })
  }
});


// 在最后一行导出，公开对象

module.exports = router;